﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Runing
{
    public class CSendInput
    {
        //[DllImport("user32.dll", SetLastError = true)]
        //static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

        //public enum VK : ushort
        //{
        //    SHIFT        = 0x10,
        //    CONTROL          = 0x11,
        //    MENU         = 0x12,
        //    ESCAPE           = 0x1B,
        //    BACK         = 0x08,
        //    TAB          = 0x09,
        //    RETURN           = 0x0D,
        //    PRIOR        = 0x21,
        //    NEXT         = 0x22,
        //    END          = 0x23,
        //    HOME         = 0x24,
        //    LEFT         = 0x25,
        //    UP           = 0x26,
        //    RIGHT        = 0x27,
        //    DOWN         = 0x28,
        //    SELECT           = 0x29,
        //    PRINT        = 0x2A,
        //    EXECUTE          = 0x2B,
        //    SNAPSHOT         = 0x2C,
        //    INSERT           = 0x2D,
        //    DELETE           = 0x2E,
        //    HELP         = 0x2F,
        //    NUMPAD0          = 0x60,
        //    NUMPAD1          = 0x61,
        //    NUMPAD2          = 0x62,
        //    NUMPAD3          = 0x63,
        //    NUMPAD4          = 0x64,
        //    NUMPAD5          = 0x65,
        //    NUMPAD6          = 0x66,
        //    NUMPAD7          = 0x67,
        //    NUMPAD8          = 0x68,
        //    NUMPAD9          = 0x69,
        //    MULTIPLY         = 0x6A,
        //    ADD          = 0x6B,
        //    SEPARATOR        = 0x6C,
        //    SUBTRACT         = 0x6D,
        //    DECIMAL          = 0x6E,
        //    DIVIDE           = 0x6F,
        //    F1           = 0x70,
        //    F2           = 0x71,
        //    F3           = 0x72,
        //    F4           = 0x73,
        //    F5           = 0x74,
        //    F6           = 0x75,
        //    F7           = 0x76,
        //    F8           = 0x77,
        //    F9           = 0x78,
        //    F10          = 0x79,
        //    F11          = 0x7A,
        //    F12          = 0x7B,
        //    OEM_1        = 0xBA,   // ',:' for US
        //    OEM_PLUS         = 0xBB,   // '+' any country
        //    OEM_COMMA        = 0xBC,   // ',' any country
        //    OEM_MINUS        = 0xBD,   // '-' any country
        //    OEM_PERIOD       = 0xBE,   // '.' any country
        //    OEM_2        = 0xBF,   // '/?' for US
        //    OEM_3        = 0xC0,   // '`~' for US
        //    MEDIA_NEXT_TRACK     = 0xB0,
        //    MEDIA_PREV_TRACK     = 0xB1,
        //    MEDIA_STOP           = 0xB2,
        //    MEDIA_PLAY_PAUSE     = 0xB3,
        //    LWIN       =0x5B,
        //    RWIN       =0x5C
        //}

        //public struct KEYBDINPUT
        //{
        //    public ushort wVk;
        //    public ushort wScan;
        //    public uint dwFlags;
        //    public long time;
        //    public uint dwExtraInfo;
        //};

        //[StructLayout(LayoutKind.Explicit, Size = 28)]
        //public struct INPUT
        //{
        //    [FieldOffset(0)]
        //    public uint type;
        //    [FieldOffset(4)]
        //    public KEYBDINPUT ki;
        //};

        //public struct Win32Consts
        //{
        //    // For use with the INPUT struct, see SendInput for an example
        //    public const int INPUT_MOUSE = 0;
        //    public const int INPUT_KEYBOARD = 1;
        //    public const int INPUT_HARDWARE = 2;
        //}

        //public void send()
        //{
        //    uint intReturn;
        //    INPUT structInput = new INPUT();
        //    structInput.type = Win32Consts.INPUT_KEYBOARD;

        //    structInput.ki.wVk = (ushort)DTO.CWindowsAPI.VKeys.VK_A;
        //    intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    // Key up the actual key-code
        //    structInput.ki.dwFlags = DTO.CWindowsAPI.KEYEVENTF_KEYUP;
        //    intReturn = SendInput(1, ref structInput, Marshal.SizeOf(typeof(INPUT))/* Marshal.SizeOf(new INPUT())*/);
        //    structInput.ki.wVk = (ushort)DTO.CWindowsAPI.VKeys.VK_A;
        //    intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    // Key up the actual key-code
        //    structInput.ki.dwFlags = DTO.CWindowsAPI.KEYEVENTF_KEYUP;
        //    intReturn = SendInput(1, ref structInput, Marshal.SizeOf(typeof(INPUT))/* Marshal.SizeOf(new INPUT())*/);
        //}

        //void Test()
        //{
        //    bool Shift = false;
        //    bool Ctrl = false;
        //    bool Alt = false;
        //    bool Win = false;

        //    uint intReturn;
        //    INPUT structInput = new INPUT();
        //    structInput.type = Win32Consts.INPUT_KEYBOARD;

        //    // Key down shift, ctrl, and/or alt
        //    structInput.ki.wScan = 0;
        //    structInput.ki.time = 0;
        //    structInput.ki.dwFlags = 0;
        //    if (Shift)
        //    {
        //        structInput.ki.wVk = (ushort)VK.SHIFT;
        //        intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    }
        //    if (Ctrl)
        //    {
        //        structInput.ki.wVk = (ushort)VK.CONTROL;
        //        intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    }
        //    if (Alt)
        //    {
        //        structInput.ki.wVk = (ushort)VK.MENU;
        //        intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    }
        //    if (Win)
        //    {
        //        structInput.ki.wVk = (ushort)VK.LWIN;
        //        intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    }
        //    // Key down the actual key-code
        //    structInput.ki.wVk = (ushort)VK.CONTROL;
        //    intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    // Key up the actual key-code
        //    structInput.ki.dwFlags = DTO.CWindowsAPI.KEYEVENTF_KEYUP;
        //    intReturn = SendInput(1, ref structInput, Marshal.SizeOf(typeof(INPUT))/* Marshal.SizeOf(new INPUT())*/);
        //    // Key up shift, ctrl, and/or alt
        //    if (Shift)
        //    {
        //        structInput.ki.wVk = (ushort)VK.SHIFT;
        //        intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    }
        //    if (Ctrl)
        //    {
        //        structInput.ki.wVk = (ushort)VK.CONTROL;
        //        intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    }
        //    if (Alt)
        //    {
        //        structInput.ki.wVk = (ushort)VK.MENU;
        //        intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    }
        //    if (Win)
        //    {
        //        structInput.ki.wVk = (ushort)VK.LWIN;
        //        intReturn = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        //    }
        //}
    }
}
